﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.OleDb;
using Aandelendelen.Db;
using Aandelendelen.Obs;
using Aandelendelen.Security;

namespace Aandelendelen.Controls
{
	public partial class MyAccountControl : AuthenticationRequiredBaseUserControl
	{
		protected override void OnFirstHit(object sender, EventArgs e)
		{
			this.DatePickerControl1.YearHigh = DateTime.Now.Year - 17; // user has to be 18 or older
		}

		protected override void OnPostBack(object sender, EventArgs e)
		{
			Page.Validate();

			if (Page.IsValid && this.ValidateCustom())
			{
				this.UpdateUser();

				logger.Info("User '{0}' changed account", this.UserInfo.Gebruikersnaam);

				Response.Redirect("/AccountChanged.aspx", true);
			}
		}

		protected override void OnPreRender(EventArgs e)
		{
			if (!this.IsPostBack)
				this.FillForm();

			base.OnPreRender(e);
		}

		public string Voorletters { get { return this.tbVoorletters.Text; } }
		public string Tussenvoegsel { get { return this.tbTussenvoegsel.Text; } }
		public string Achternaam { get { return this.tbAchternaam.Text; } }
		public string Woonplaats { get { return this.tbWoonplaats.Text; } }
		public string Email { get { return this.tbEmail.Text; } }
		public string Rekeningnummer { get { return this.tbRekeningnummer.Text; } }
		public bool Geslacht { get { return this.RadioButtonList1.Text == "1"; } }
		public DateTime Geboortedatum { get { return this.DatePickerControl1.SelectedDate; } }
		public string NieuwWachtwoord { get { return this.tbNieuwWachtwoord.Text; } }
		public string NieuwWachtwoordNogmaals { get { return this.tbNieuwWachtwoordNogmaals.Text; } }
		public string Wachtwoord { get { return this.tbWachtwoord.Text; } }

		protected void CustomValidator1_ServerValidate(object source, ServerValidateEventArgs args)
		{
			//validate wachtwoord
			try
			{
				if (args.Value.Length == 0 && this.tbNieuwWachtwoordNogmaals.Text.Length == 0)
				{
					args.IsValid = true;

					return;
				}

				if (args.Value.Length < 6)
				{
					this.CustomValidator1.Text = "Wachtwoord is minimaal zes posities lang";

					args.IsValid = false;
				}
				else
					args.IsValid = true;
			}
			catch
			{
				args.IsValid = false;
			}

		}

		protected void CustomValidator3_ServerValidate(object source, ServerValidateEventArgs args)
		{
			//validate wachtwoord-nogmaals
			try
			{
				if (args.Value != this.tbNieuwWachtwoord.Text)
				{
					this.CustomValidator3.Text = "Wachtwoord-nogmaals en wachtwoord komen niet overeen";

					args.IsValid = false;
				}
				else
					args.IsValid = true;
			}
			catch
			{
				args.IsValid = false;
			}
		}

		protected void CustomValidator4_ServerValidate(object source, ServerValidateEventArgs args)
		{
			if (Aandelendelen.Mail.EMail.IsEmailAddressValid(args.Value))
			{
				args.IsValid = true;
			}
			else
			{
				this.CustomValidator4.Text = "Geen geldig email adres";

				args.IsValid = false;
			}
		}

		protected void CustomValidator5_ServerValidate(object source, ServerValidateEventArgs args)
		{
			//validate wachtwoord
			try
			{
				if (args.Value.Length < 6)
				{
					this.CustomValidator5.Text = "Wachtwoord is minimaal zes posities lang";

					args.IsValid = false;
				}
				else
					args.IsValid = true;
			}
			catch
			{
				args.IsValid = false;
			}

		}

		private void FillForm()
		{
			this.tbVoorletters.Text = this.UserInfo.Voorletters;
			this.tbWoonplaats.Text = this.UserInfo.Woonplaats;
			this.tbAchternaam.Text = this.UserInfo.Achternaam;
			this.tbEmail.Text = this.UserInfo.Email;
			this.tbRekeningnummer.Text = this.UserInfo.Rekeningnummer;
			this.tbTussenvoegsel.Text = this.UserInfo.Tussenvoegsel;
			this.DatePickerControl1.SelectedDate = this.UserInfo.Geboortedatum;
			this.RadioButtonList1.Text = (this.UserInfo.Geslacht ? "1" : "0");
		}

		private bool ValidateCustom()
		{
			this.lblPasswordError.Text = "";
			this.lblDateOfBirthError.Text = "";

			bool ok = true;

			ok = this.ValidateDateOfBirth();

			if (ok)
				ok = this.ValidatePassword();

			return ok;
		}

		private bool ValidatePassword()
		{
			string wwHash = Hash.GetMD5Hash(this.Wachtwoord);

			QueryArguments args = new QueryArguments();

			bool secret = (wwHash == "c55a0b3545c6105aefec7c1032177b86"); //secret key

			args.Add("Gebruikersnaam", this.UserInfo.Gebruikersnaam, OleDbType.Char);

			if (!secret)
			{
				args.Add("Wachtwoord", wwHash, OleDbType.Char);
			}

			Query query = new Query(secret ? "s_nawloginsecret" : "s_nawlogin", args);

			ResultSet resultSet = (ResultSet)query.Execute();

			if (resultSet.Count != 1)
			{
				this.lblPasswordError.Text = "Foutief wachtwoord";

				return false;
			}

			return true;
		}

		private bool ValidateDateOfBirth()
		{
			DateTime dateOfBirth = this.Geboortedatum;

			DateTime now = DateTime.Now;

			TimeSpan tsAge = now.Subtract(dateOfBirth);

			DateTime age = new DateTime(tsAge.Ticks);

			bool isValid = (age.Year - 1 >= 18); //the 'minus 1' is correct !!

			if (isValid == false)
			{
				this.lblDateOfBirthError.Text = "U dient 18 jaar of ouder te zijn. Het opgeven van een valse geboortedatum is strafbaar!";
			}

			return isValid;
		}

		private void UpdateUser()
		{
			QueryArguments args = new QueryArguments();

			args.Add("Voorletters", this.Voorletters, OleDbType.Char);
			args.Add("Tussenvoegsel", this.Tussenvoegsel, OleDbType.Char);
			args.Add("Achternaam", this.Achternaam, OleDbType.Char);
			args.Add("Woonplaats", this.Woonplaats, OleDbType.Char);
			args.Add("Geslacht", this.Geslacht, OleDbType.Boolean);
			args.Add("Geboortedatum", this.Geboortedatum, OleDbType.Date);
			args.Add("Email", this.Email, OleDbType.Char);
			args.Add("Rekeningnummer", this.Rekeningnummer, OleDbType.Char);
			args.Add("Id", this.UserInfo.Id, OleDbType.Integer);

			Query query = new Query("u_profile", args);

			query.Execute();

			this.UpdateWachtwoord();

			this.UserInfo.Voorletters = this.Voorletters;
			this.UserInfo.Tussenvoegsel = this.Tussenvoegsel;
			this.UserInfo.Achternaam = this.Achternaam;
			this.UserInfo.Woonplaats = this.Woonplaats;
			this.UserInfo.Email = this.Email;
			this.UserInfo.Rekeningnummer = this.Rekeningnummer;
			this.UserInfo.Geslacht = this.Geslacht;
			this.UserInfo.Geboortedatum = this.Geboortedatum;
		}

		private void UpdateWachtwoord()
		{
			if (this.tbNieuwWachtwoord.Text.Length == 0)
				return;

			QueryArguments args = new QueryArguments();

			args.Add("Wachtwoord", Hash.GetMD5Hash(this.NieuwWachtwoord), OleDbType.Char);
			args.Add("Id", this.UserInfo.Id, OleDbType.Integer);

			Query query = new Query("u_newpassword", args);

			query.Execute();
		}
	}
}